package utilities;

/**
 *
 * @author Ricardo Sansores Aguilar
 */
public class OperatorManager {
 
    public static final char CONCATENATION_CHAR = '.';    
    public static final char KLEEN_CHAR = '*';
    public static final char OR_CHAR = '+';
    public static final char OPEN_ROUND_BRACKET_CHAR = '(';
    public static final char CLOSE_ROUND_BRACKET_CHAR = ')';
    public static final char EPSILON_CHAR = (char)949;
    
    public static final int DEFAULT_KLEENE_PRECEDENCE = 3;
    public static final int DEFAULT_CONCATENATION_PRECEDENCE = 2;
    public static final int DEFAULT_OR_PRECEDENCE = 1;
    
    private int orOperatorPrecedence;
    private int concatenationOperatorPrecendence;
    private int kleeneOperatorPrecedence;

    /**
     * 
     */
    public OperatorManager() {
    }

    /**
     * 
     * @param orOperatorPrecedence
     * @param concatenationOperatorPrecendence
     * @param kleeneOperatorPrecedence 
     */
    public OperatorManager(int orOperatorPrecedence, int concatenationOperatorPrecendence, int kleeneOperatorPrecedence) {
        this.orOperatorPrecedence = orOperatorPrecedence;
        this.concatenationOperatorPrecendence = concatenationOperatorPrecendence;
        this.kleeneOperatorPrecedence = kleeneOperatorPrecedence;
    }
    
    /**
     * 
     * @param charToGetPrecedence
     * @return 
     */
    public int getOperatorPrecendence(char charToGetPrecedence) {
        switch (charToGetPrecedence) {
            //Tomamos como máxima precedencia los símbolos de or
            case OperatorManager.OR_CHAR:
                return getOrOperatorPrecedence();
            case OperatorManager.CONCATENATION_CHAR:
                return getConcatenationOperatorPrecendence();
            case OperatorManager.KLEEN_CHAR:
                return getKleeneOperatorPrecedence();
            default:
                return 4;
        }
    }
    
    public static boolean isOperator(char character){
        return character == OR_CHAR || character == CONCATENATION_CHAR || character == KLEEN_CHAR;
    }
    
    /**
     * Obtiene la precedencia actual del operador or
     * @return the orOperatorPrecedence
     */
    public int getOrOperatorPrecedence() {
        return orOperatorPrecedence;
    }

    /**
     * Establece la precendencia del operador or
     * @param orOperatorPrecedence the orOperatorPrecedence to set
     */
    public void setOrOperatorPrecedence(int orOperatorPrecedence) {
        this.orOperatorPrecedence = orOperatorPrecedence;
    }

    /**
     * Obtiene la precedencia actual del operador de concatenación
     * @return the concatenationOperatorPrecendence
     */
    public int getConcatenationOperatorPrecendence() {
        return concatenationOperatorPrecendence;
    }

    /**
     * Establece la precendencia del operador de concatenación
     * @param concatenationOperatorPrecendence the concatenationOperatorPrecendence to set
     */
    public void setConcatenationOperatorPrecendence(int concatenationOperatorPrecendence) {
        this.concatenationOperatorPrecendence = concatenationOperatorPrecendence;
    }

    /**
     * Obtiene la precedencia actual de la cerradura de kleene
     * @return the kleeneOperatorPrecedence
     */
    public int getKleeneOperatorPrecedence() {
        return kleeneOperatorPrecedence;
    }

    /**
     * Establece la precendencia de la cerradura kleene
     * @param kleeneOperatorPrecedence the kleeneOperatorPrecedence to set
     */
    public void setKleeneOperatorPrecedence(int kleeneOperatorPrecedence) {
        this.kleeneOperatorPrecedence = kleeneOperatorPrecedence;
    }
    
    /**
     * Restablece a sus valores de defecto las precedencias de operadores.
     */
    public void resetPrecedences(){
        setOrOperatorPrecedence(DEFAULT_OR_PRECEDENCE);
        setConcatenationOperatorPrecendence(DEFAULT_CONCATENATION_PRECEDENCE);
        setKleeneOperatorPrecedence(DEFAULT_KLEENE_PRECEDENCE);    
    }
}
